package com.mlkj.ytdc.utils;

import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.bridge.ReadableMap;

import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.modules.core.DeviceEventManagerModule;
import com.mlkj.ytdc.BuildConfig;
import com.mlkj.ytdc.modules.Module;

import javax.annotation.Nullable;


/**
 * java 和 rn 之间的事件通信
 */
public class Event {
    //定义向 RN 发送事件的函数
    public static void sendEvent(ReactContext reactContext, String eventName, @Nullable WritableMap params) {
        reactContext
                .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
                .emit(eventName, params);
    }

    /**
     * 发送消息
     *
     * @param reactContext 上下文
     * @param eventName    事件名
     * @param event        事件对象, 使用Arguments.createMap() 创建, 使用putxxx 添加对应的数据
     */
    public static void emit(ReactContext reactContext, String eventName, WritableMap event) {
        sendEvent(reactContext, eventName, event);
    }

    /**
     * 调试事件
     */
    public static <T> void logEmit(T msg) {
        if (!BuildConfig.DEBUG) return;

        WritableMap map = Arguments.createMap();

        String clsName = msg.getClass().getName();
        switch (clsName) {
            case "java.lang.String":
                map.putString("msg", (String) msg);
                break;
            case "java.lang.Integer":
                map.putInt("msg", (Integer) msg);
                break;
            case "java.lang.Boolean":
                map.putBoolean("msg", (Boolean) msg);
                break;
            case "com.facebook.react.bridge.ReadableNativeMap":
                map.putMap("msg", (ReadableMap) msg);
                break;
            case "com.facebook.react.bridge.WritableNativeArray":
                map.putArray("msg", (ReadableArray) msg);
                break;
            default:
                map.putString("msg", "不支持的数据类型");
                map.putString("clsName", clsName);
                break;
        }
        Event.emit(Module.ctx, Module.LOG_EVENT_KEY, map);
    }
}